package logica_de_presentacion;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.util.Calendar;

import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerDateModel;
import javax.swing.SpinnerNumberModel;

import comun.Capitulo;
import logica_de_negocio.ExcepDatosNoAdmitidos;
import logica_de_negocio.FaltanDatosEnLaBaseDeDatos;
import logica_de_negocio.excepAnadirDupli;
import logica_de_negocio.gestorCapitulo;
import logica_de_negocio.gestorSerie;

public class FormularioAnadirModificarCapitulo extends JInternalFrame implements
		ActionListener {

	private static final long serialVersionUID = 1L;
	protected JButton salir, anadir;
	protected JTextField titu;
	protected JSpinner.DateEditor fecha_emi;
	protected JComboBox<String> listaSeries;
	protected JSpinner spiNum_cap, spiNum_temp;
	protected boolean estadoModi;

	protected gestorCapitulo gc = new gestorCapitulo();
	protected String[][] lista;
	private int idCapituloOri;

	/**
	 * Ventana para anadir/modificar capitulos
	 * 
	 * @throws ClassNotFoundException
	 *             No existe la base de datos
	 */

	public FormularioAnadirModificarCapitulo(boolean estadoModi, int actNCap,
			int actNTemp, java.util.Date fecha) throws ClassNotFoundException {

		super("Anadir/Modificar capitulo", true, true, true, true);

		this.estadoModi = estadoModi;
		this.setVisible(true);
		this.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
		gestorSerie gs = new gestorSerie();
		if (gs.estaVacia()) {
			JOptionPane.showMessageDialog(new Frame(),
					"No hay series a las que anadir capitulos :(");
		} else {
			JPanel textos = new JPanel(new GridLayout(10, 2));// FILAS,Columnas
			JPanel Botones = new JPanel();
			this.getContentPane().setLayout(new FlowLayout());// TIPO DE
																// ORDENACION

			// TEXTO
			// TITULO
			titu = new JTextField("Titulo del capitulo", 20);
			textos.add(titu);
			// SERIE
			listaSeries = new JComboBox<>(lista());
			textos.add(listaSeries);
			// NUN_CAP
			spiNum_cap = new JSpinner();// ACTUAL , MIN, MAX, SALTO
			spiNum_cap.setModel(new SpinnerNumberModel(actNCap, 0, 99, 1));
			spiNum_cap.setEditor(new JSpinner.NumberEditor(spiNum_cap, "0"));
			JLabel jlNum_cap = new JLabel("Numero de capitulo");
			JPanel jpNum_cap = new JPanel();
			jpNum_cap.add(jlNum_cap);
			jpNum_cap.add(spiNum_cap);
			textos.add(jpNum_cap);
			// FECHA DE EMISION
			JSpinner se = new JSpinner(new SpinnerDateModel(fecha, null, null,
					Calendar.DAY_OF_WEEK_IN_MONTH));
			fecha_emi = new JSpinner.DateEditor(se, "MM/d/yyyy");
			se.setEditor(fecha_emi);
			JLabel jlfecha_emi = new JLabel("Fecha de emision del capitulo:");
			JPanel jpfecha_emi = new JPanel();
			jpfecha_emi.add(jlfecha_emi);
			jpfecha_emi.add(se);
			textos.add(jpfecha_emi);
			// NUMERO DE TEMPORADA
			spiNum_temp = new JSpinner();// ACTUAL , MIN, MAX, SALTO
			spiNum_temp.setModel(new SpinnerNumberModel(actNTemp, 0, 9, 1));
			spiNum_temp.setEditor(new JSpinner.NumberEditor(spiNum_temp, "0"));
			JLabel jlT = new JLabel("Numero de temporada: ");
			JPanel jpT = new JPanel();
			jpT.add(jlT);
			jpT.add(spiNum_temp);
			textos.add(jpT);

			this.getContentPane().add(textos, "North");

			// BOTONES
			ImageIcon tick = createImageIcon("/logica_de_presentacion/imagenes/TICK.gif");
			if (estadoModi == false) {
				anadir = new JButton("Anadir", tick);
			} else {
				anadir = new JButton("Modificar", tick);
			}
			anadir.setVerticalTextPosition(AbstractButton.CENTER);
			anadir.setHorizontalTextPosition(AbstractButton.LEADING); // aka
																		// LEFT,
																		// for
																		// left-to-right
																		// locales
			if (estadoModi == false) {
				anadir.setToolTipText("Anadir la capitulo en la base de datos");
			} else {
				anadir.setToolTipText("Modificar la capitulo en la base de datos");
			}
			Botones.add(anadir);
			anadir.addActionListener(this);

			ImageIcon cancelar = createImageIcon("/logica_de_presentacion/imagenes/CANCELAR.gif");
			salir = new JButton("Cancelar", cancelar);
			salir.setVerticalTextPosition(AbstractButton.CENTER);
			salir.setHorizontalTextPosition(AbstractButton.LEADING); // aka
																		// LEFT,
																		// for
																		// left-to-right
																		// locales

			Botones.add(salir);
			salir.addActionListener(this);

			// ANADIMOS AL PANEL PRINCIPAL
			this.getContentPane().add(Botones, "South");

			// TAMANO JUSTO
			this.pack();
		}
	}

	private String[] lista() throws ClassNotFoundException {

		String[] a;

		gestorSerie gs = new gestorSerie();

		lista = gs.getTitulo();
		a = new String[lista.length];
		for (int i = 0; i < lista.length; i++) {// NOS DA EL NUMERO DE FILAS
			a[i] = (String) lista[i][1];
		}
		return a;
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		JButton botonPulsa = (JButton) e.getSource();

		if (botonPulsa == salir) {

			int valor = JOptionPane.showConfirmDialog(this, "ESTA SEGURO ?");
			// YES=0, NO=1,Cancel =2
			if (valor == 0) {
				this.dispose();
			}
		} else {// MODIFICAR; o ANADIR

			if (botonPulsa == anadir) {

				if (estadoModi == false) {
					// ANADIR

					try {
						gc.cargarDatos();
						Capitulo cap = capDese();
						boolean corec = gc.anadirC(cap);
						// MIRAMOS QUE ESTA
						if (corec) {
							JOptionPane.showMessageDialog(new Frame(),
									"Capitulo anadido");
						} else {
							JOptionPane.showMessageDialog(new Frame(),
									"Capitulo _NO_ anadida");
						}
						this.dispose();
					} catch (excepAnadirDupli e1) {
						JOptionPane.showMessageDialog(new Frame(), e1.getDes());
					} catch (FaltanDatosEnLaBaseDeDatos e1) {
						JOptionPane.showMessageDialog(new Frame(),
								e1.getFalta());
					} catch (ExcepDatosNoAdmitidos e1) {
						JOptionPane.showMessageDialog(new Frame(),
								e1.getCausa());
					} catch (ClassNotFoundException e1) {
						JOptionPane.showMessageDialog(new Frame(),
								"No hay informacion en la base de datos");
						this.dispose();
					}
				} else {
					try {
						Capitulo cap = capDese();
						cap.setId_c(idCapituloOri);
						boolean mo = gc.modifyCapitulo(cap);
						// MIRAMOS QUE ESTA
						if (mo) {
							JOptionPane.showMessageDialog(new Frame(),
									"Capitulo modificado");
						}
						this.dispose();
					} catch (FaltanDatosEnLaBaseDeDatos e1) {
						JOptionPane.showMessageDialog(new Frame(),
								e1.getFalta());
					} catch (ExcepDatosNoAdmitidos e1) {
						JOptionPane.showMessageDialog(new Frame(),
								e1.getCausa());
					} catch (ClassNotFoundException e1) {
						JOptionPane.showMessageDialog(new Frame(),
								"No hay informacion en la base de datos");
						this.dispose();
					}
				}

			}
		}
	}

	private Capitulo capDese() throws ExcepDatosNoAdmitidos {
		Capitulo capDese = new Capitulo();

		capDese.setId_s(putId_s());
		capDese.setNombre(titu.getText());
		capDese.setNum_temp(putNum_temp());
		capDese.setNum_cap(putNum_cap());
		capDese.setFecha_emi(putFecha_emi());
		return capDese;
	}

	@Deprecated
	private Date putFecha_emi() {

		JFormattedTextField dfecha_emi = fecha_emi.getTextField();
		String afecha_emi = dfecha_emi.getText();
		java.util.Date newfecha_emi = new java.util.Date(afecha_emi);
		return new Date(newfecha_emi.getYear(), newfecha_emi.getMonth(),
				newfecha_emi.getDay());
	}

	private Integer putNum_cap() throws ExcepDatosNoAdmitidos {
		Integer dev = 0;
		Object a = spiNum_cap.getValue();
		dev = (Integer) a;

		if (dev <= 0) {// POR SI METE NEGATIVOS
			ExcepDatosNoAdmitidos e = new ExcepDatosNoAdmitidos();
			e.setCausa("Revise el numero de capitulo selecionado");
			throw e;
		}

		return dev;
	}

	private Integer putNum_temp() throws ExcepDatosNoAdmitidos {

		Integer dev = 0;
		Object a = spiNum_temp.getValue();
		dev = (Integer) a;

		if (dev <= 0) {
			ExcepDatosNoAdmitidos e = new ExcepDatosNoAdmitidos();
			e.setCausa("Revise el numero de temporada selecionado");
			throw e;
		}

		return dev;
	}

	private int putId_s() throws ExcepDatosNoAdmitidos {
		int id_s = 0;
		for (int i = 0; i < lista.length; i++) {
			String s = lista[i][1];
			if (s.equals((String) listaSeries.getSelectedItem())) {
				id_s = (Integer) Integer.parseInt((String) lista[i][0]);
				i = lista.length;
			}
		}

		if (id_s == 0) {
			ExcepDatosNoAdmitidos e = new ExcepDatosNoAdmitidos();
			e.setCausa("Revise la serie selecionada");
			throw e;
		}

		return id_s;
	}

	/**
	 * Returns an ImageIcon, or null if the path was invalid.
	 * 
	 * @param path
	 * @return Devulve la imagen en formato ImagenIcon
	 */
	protected static ImageIcon createImageIcon(String path) {
		java.net.URL imgURL = Button.class.getResource(path);
		if (imgURL != null) {
			return new ImageIcon(imgURL);
		} else {
			System.err.println("Couldn't find file: " + path);
			return null;
		}
	}

	public void cargarMO(Capitulo cap) throws ClassNotFoundException {// FALTA
																		// RESPETAR
																		// LA
																		// FECHA

		idCapituloOri = cap.getId_c();

		try {
			titu.setText(cap.getNombre());

			gestorSerie gs = new gestorSerie();
			listaSeries.setSelectedItem(gs.getSerie(cap.getId_c()).getTitulo());

		} catch (FaltanDatosEnLaBaseDeDatos e) {
		}
	}
}
